{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "c89c3776",
   "metadata": {},
   "source": [
    "# 高等数学与数值计算\n",
    "## (一) 以微分初步知识及梯度下降算法解决最优化问题"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "36194748",
   "metadata": {},
   "source": [
    "<div class=\"alert alert-info\" role=\"alert\">\n",
    "❓ GitModel 公司发明了一种专用于数值计算的平板电脑 GitNum$,$ 考虑到员工生产效率的问题$,$ GitNum 的生产成本是与生产台数相关的. 函数关系为 \n",
    "\n",
    "$$C(n)=1250n(2-e^{-(n-5000)^2}).$$\n",
    "    \n",
    "请问如何确定这批 GitNum 的生产台数使得每台的平均生产成本最小使得经济效益最大呢?\n",
    "</div>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cda80e3c",
   "metadata": {},
   "source": [
    "```分析```： 求平均生产成本最小$,$ 本质上就是求平均成本函数 $\\overline{C}(n)=\\dfrac{C(n)}{n}$ 的最小值. 事实上$,$ 初中我们就经常接触类似的最值问题$,$ 只不过所谓的目标函数往往是最简单的二次函数. 而在高中之后我们学习了求导工具之后发现对任意可导的函数我们都可以探究其导数异号零点来确定其极值点.\n",
    "\n",
    "诚然$,$ 仅仅是导数零点并不足以说明其就是极值点$,$ 如下图的函数 $y=x^3,$ 我们发现 $x=0$ 是其导数零点但在图像上仅仅只是函数的一个$\"$拐点$\"$.\n",
    "\n",
    "<img src=\"./figures/1.jpg\" width=700>\n",
    "\n",
    "<center>图 1 : $y=x^3$ 及其导数图像</center>\n",
    "\n",
    "这是因为导函数 $y'=3x^2$ 在导数零点 $x=0$ 处仅仅是$\"$切过$\"$ $x$ 轴而非$\"$穿过$\"$ $x$ 轴! 而分析学告诉我们$,$ 导函数$f$ 在零点 $x_0$ 处 $\"$穿过$\"$ $x$ 轴的图像性质本质上就是 $f$ 在零点处附近是单调的$,$ 亦即二阶导函数 $($导数的导数$)$ $f''(x_0)>0$ 或 $f''(x_0)<0$!\n",
    "\n",
    "<img src=\"./figures/1-2.png\" width=700>\n",
    "\n",
    "<center>表 1 : 极值点函导数性态</center>\n",
    "\n",
    "回到问题上来$,$ 要求 $\\overline{C}(n)$ 的极值点$,$ 我们首先需要求出导函数 $\\overline{C}'(n)$ 的零点 $n_0,$ 如果 $\\overline{C}''(n_0)>0,$ 那么 $n_0$ 即为 $\\overline{C}(n)$ 的极小值点.\n",
    "\n",
    "代码如下 :"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "07a13dde",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-06-03T07:11:41.255705Z",
     "start_time": "2022-06-03T07:11:36.453769Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle - 1250 \\cdot \\left(10000 - 2 n\\right) e^{- \\left(n - 5000\\right)^{2}}$"
      ],
      "text/plain": [
       "-1250*(10000 - 2*n)*exp(-(n - 5000)**2)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sympy import *\n",
    "\n",
    "n = symbols('n')\n",
    "y = 1250*(2-exp(-(n-5000)**2))\n",
    "\n",
    "func1 = diff(y,n) # 求导数\n",
    "func1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "8d65dd5d",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-06-03T07:11:41.271596Z",
     "start_time": "2022-06-03T07:11:41.256636Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "该函数驻点为 [5000]\n"
     ]
    }
   ],
   "source": [
    "stag = solve(diff(y,n),n)\n",
    "print(\"该函数驻点为\",stag) # 计算驻点"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "447bfa09",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-06-03T07:11:41.303591Z",
     "start_time": "2022-06-03T07:11:41.272594Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 2500 \\cdot \\left(1 - 2 \\left(n - 5000\\right)^{2}\\right) e^{- \\left(n - 5000\\right)^{2}}$"
      ],
      "text/plain": [
       "2500*(1 - 2*(n - 5000)**2)*exp(-(n - 5000)**2)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 计算二阶导数\n",
    "func2 = diff(y, n, 2) # 求导数\n",
    "func2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "97ef8204",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-06-03T07:11:41.319060Z",
     "start_time": "2022-06-03T07:11:41.305099Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2500.00000000000\n"
     ]
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\text{True}$"
      ],
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 计算驻点的二阶导数值，验证正负\n",
    "print(func2.evalf(subs = {n:5000}))\n",
    "func2.evalf(subs = {n:5000}) > 0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "c1153255",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-06-03T07:11:41.335018Z",
     "start_time": "2022-06-03T07:11:41.320057Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 1250.0$"
      ],
      "text/plain": [
       "1250.00000000000"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 函数的极小值\n",
    "y.evalf(subs = {n:5000})"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "448f2097",
   "metadata": {},
   "source": [
    "经验证$,$ $n_0=5000$ 确实为 $\\overline{C}(n)$ 的极小值点$,$ 即第一批 GitNum 生产台数计划为 $5000$ 台时平均成本最小$,$ 为 $1250$ 元/台."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5689cf79",
   "metadata": {},
   "source": [
    "<div class=\"alert alert-info\" role=\"alert\">\n",
    "<strong> 抽象提炼 </strong> \n",
    "    \n",
    "数学建模中$,$ 优化问题是渗透到各个方面的$,$ 小到最优参数的确定$,$ 大到最优策略的规划. 每一个优化问题都可以以如下标准形式给出 : \n",
    "\\begin{equation}\\label{eq 1}\n",
    "\t\\max f(x)\n",
    "\\end{equation}\n",
    "$$\\mathrm{s.t.} \\begin{cases}\n",
    "\tg_i(x)\\geqslant 0,i=1,2,\\cdots,n\\\\\n",
    "\th_j(x)=0,j=1,2,\\cdots,m\n",
    "\\end{cases}$$\n",
    "其中 $f(x)$ 即是我们需要求最值的函数$,$ $x$ 是我们用来 $\"$决策$\"$ 的变量. $g_i(x)\\geqslant 0,h_j(x)=0$ 分别是决策变量 $x$ 满足的条件$,$ 即决策变量 $x$ 的约束. 当决策变量 $x$ 没有约束时$,$ 称为<strong>无约束优化问题</strong>.\n",
    "</div>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "26a567be",
   "metadata": {},
   "source": [
    "上文提到的GitNum生产台数问题即为一个最简单的无约束优化问题——目标函数有**明确表达式，二阶以上可导，定义域离散程度不高. 往往生产一批产品的数量范围是足够大的以至于我们可以将离散的整数视为连续的**. 对于这样的简单优化问题$,$ 利用数学分析的知识可以做到精确的分析. 我们给出优化领域最经典也是最实用的判别条件."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "db24c2fa",
   "metadata": {},
   "source": [
    "<div class=\"alert alert-info\" role=\"alert\">\n",
    "<strong> 命题1:[一阶最优化必要条件] </strong> \n",
    "设 $f(x)$ 是 $\\mathbf{R}$ 上的可导函数. 若 $x^*$ 是 $f$ 的极值点则\n",
    "\t\\begin{equation}\\label{eq 2}\n",
    "\t\tf'(x^*)=0.\n",
    "\t\\end{equation}\n",
    "\t其中 $f'$ 是 $f$ 的一阶导数.\n",
    "</div>\n",
    "\n",
    "<div class=\"alert alert-info\" role=\"alert\">\n",
    "<strong> 命题2:[二阶最优化必要条件] </strong> \n",
    "设 $f(x)$ 是 $\\mathbf{R}$ 上的可导函数. 若 $x^*$ 是 $f$ 的极值点则\n",
    "设 $f(x)$ 是 $\\mathbf{R}$ 上的二阶可导函数. 若 $x^*$ 是 $f$ 的极大$($小$)$值点则\n",
    "\t\\begin{equation}\\label{eq 3}\n",
    "\t\tf'(x^*)=0,f''(x^*)\\leqslant0 (f''(x^*)\\geqslant 0).\n",
    "\t\\end{equation}\n",
    "    其中 $f''$ 是 $f$ 的二阶导数.\n",
    "</div>\n",
    "\n",
    "<div class=\"alert alert-info\" role=\"alert\">\n",
    "<strong> 命题3:[二阶最优化充分条件] </strong> \n",
    "\t设 $f(x)$ 是 $\\mathbf{R}$ 上的二阶可导函数. 若 $x^*$ 满足\n",
    "\t$$f'(x^*)=0,f''(x^*)<0 (f''(x^*)>0),$$\n",
    "则 $x^*$ 是 $f$ 的极大$($小$)$值点.\n",
    "</div>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fb36c1c8",
   "metadata": {},
   "source": [
    "<div class=\"alert alert-info\" role=\"alert\">\n",
    "❓ GitModel 公司通过 GitNum 的发售赚到第一桶金后马不停蹄地投入到 GitNum 的改良研制中$,$ 经市场调查后 GitModel 公司发现根据用户需求可推出轻便版以及高性能版的 GitNum. 三种 GitNum:\n",
    "\n",
    "<img src=\"./figures/1-4.png\">\n",
    "\n",
    "在这一批生产中$,$ GitModel 公司应该制定怎么样的生产计划即三种 GitNum 的生产台数才能使得利润与成本的比值最大化?\n",
    "</div>\n",
    "\n",
    "我们把三种 GitNum 的生产台数按上表顺序标记序号 $n_i,i=1,2,3,$ 分别用 $R,Q,C$ 来代表收入$,$ 利润以及成本. 问题旨在求出利润/成本 $r=\\dfrac{Q}{C}$ 的最大值$,$ 而我们需要同时考虑三种 GitNum 的生产台数$,$ 也就是说$,$ 需要求极值的函数 $r$ 是 $n_1,n_2,n_3$ 的多元函数 ! \n",
    "\n",
    "我们逐步将各种函数列出来以得到目标函数 $\\dfrac{Q}{C},$ 总收入函数为 $$R(n_1,n_2,n_3)=2000n_1+3000n_2+4500n_3,$$\n",
    "总成本函数为\n",
    "$$C(n_1,n_2,n_3)=750n_1(2-e^{-(n_1-6000)^2})+1250n_2(2-e^{-(n_2-5000)^2})+2000n_3(2-e^{-(n_3-3000)^2}),$$\n",
    "总利润函数为\n",
    "$$Q(n_1,n_2,n_3)=R(n_1,n_2,n_3)-C(n_1,n_2,n_3),$$\n",
    "所以总利润与总成本比值为\n",
    "\n",
    "\\begin{align}\n",
    "\tr(n_1,n_2,n_3)&=\\dfrac{R(n_1,n_2,n_3)-C(n_1,n_2,n_3)}{C(n_1,n_2,n_3)}\\\\\n",
    "\t&=\\dfrac{R(n_1,n_2,n_3)}{C(n_1,n_2,n_3)}-1\\\\\n",
    "\t&=\\dfrac{2000n_1+3000n_2+4500n_3}{750n_1(2-e^{-(n_1-6000)^2})+1250n_2(2-e^{-(n_2-5000)^2})+2000n_3(2-e^{-(n_3-3000)^2})}-1.\n",
    "\\end{align}\n",
    "\n",
    "优化问题即为\n",
    "$$\n",
    "\\max\\limits_{n_1,n_2,n_3\\geqslant 1}r(n_1,n_2,n_3).\n",
    "$$\n",
    "\n",
    "依样画葫芦$,$ 该问题不过是第一个问题的变量 Plus 版$,$ 我们仍然可以采用研究导数以及二阶导数性态的方式去求出极大值组合 $(n_1^*,n_2^*,n_3^*).$ \n",
    "\n",
    "**那有的同学可能就会问了 : 一元函数分析跟多元函数分析有什么区别呢?**\n",
    "\n",
    "在多元函数 $f$ 中$,$ 我们只能对单个变量 $x$ 求偏导数 $f_x,$ 这远远不足以刻画导数的全部信息. 所以$,$ 梯度 $($全导数$)$ 以及 Hesse 矩阵的概念替代了一元函数中导数以及二阶导数.\n",
    "\n",
    "<div class=\"alert alert-info\" role=\"alert\">\n",
    "<strong> 定义1:[Hesse 矩阵] </strong> \n",
    "设 $f:\\mathbf{R}^n\\to R$ 是 $n$ 元函数$,$ $x_i,i=1,2,\\cdots,n$ 是变量.\n",
    "\t\n",
    "记 $f$ 对变量 $x_i$ 方向的偏导数为 $f'_i,$ 称所有偏导数组成的列向量 $[f_1',f_2',\\cdots,f_n']^T := \\nabla f,$ 为函数 $f$ 的全导数$,$ 亦称**梯度**.\n",
    "\t\n",
    "记偏导数 $f_i'$ 对变量 $x_j$ 方向的二阶偏导数为 $f''_{ij}$ 称 $n\\times n$ 方阵$$\\begin{bmatrix}\n",
    "\t\tf''_{11}&f''_{12}&\\cdots & f''_{1n}\\\\\n",
    "\t\tf''_{21}&f''_{22}&\\cdots & f''_{1n}\\\\\n",
    "\t\t\\vdots&\\vdots&\\ddots &\\vdots\\\\\n",
    "\t\tf''_{n1}&f''_{n2}&\\cdots & f''_{nn}\\\\\n",
    "\t\\end{bmatrix} := \\nabla^2 f,$$ \n",
    "为函数 $f$ 的<strong> Hesse 矩阵</strong>.\n",
    "</div>\n",
    "\n",
    "在推广最优化条件之前$,$ 我们先从直观上进行条件的表述. 如下图:\n",
    "\n",
    "<img src=\"./figures/1-8.jpg\" width = 500>\n",
    "\n",
    "<img src=\"./figures/1-9.jpg\" width = 400>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4e771b31",
   "metadata": {},
   "source": [
    "从上图我们不难猜测 "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cedc0843",
   "metadata": {},
   "source": [
    "<img src=\"./figures/1-10.png\">"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "02e17141",
   "metadata": {},
   "source": [
    "事实上$,$ 通过 Taylor 展开我们即可验证猜想的正确性$,$ 理论证明不难而繁$,$ 我们只保留最精华实用的命题 : 最优化条件对应的多元函数版本则如下 :\n",
    "\n",
    "<div class=\"alert alert-info\" role=\"alert\">\n",
    "<strong> 命题4:[多元无约束问题一阶最优化必要条件] </strong> \n",
    "设 $f(x)$ 是 $\\mathbf{R}^n$ 上的 $n$ 元可导函数. 若 $x^*$ 是 $f$ 的极值点则\n",
    "\t\\begin{equation}\\label{eq 2+}\n",
    "\t\t\\nabla f(x^*)=0.\n",
    "\t\\end{equation}\n",
    "\t其中 $\\nabla f$ 是 $f$ 的梯度.\n",
    "</div>\n",
    "\n",
    "<div class=\"alert alert-info\" role=\"alert\">\n",
    "<strong> 命题5:[多元无约束问题二阶最优化必要条件] </strong> \n",
    "设 $f(x)$ 是 $\\mathbf{R}^n$ 上的 $n$ 元二阶可导函数. 若 $x^*$ 是 $f$ 的极大$($小$)$值点则\n",
    "\t\\begin{equation}\\label{eq 3+}\n",
    "\t\t\\nabla f(x^*)=0,\\nabla^2 f(x^*) \\ \\text{半负定} \\ (\\nabla^2 f(x^*)\\ \\text{半正定}),\n",
    "\t\\end{equation}\n",
    "\t其中 $\\nabla^2 f$ 是 $f$ 的 Hesse 矩阵.\n",
    "</div>\n",
    "\n",
    "<div class=\"alert alert-info\" role=\"alert\">\n",
    "<strong> 命题6:[多元无约束问题二阶最优化充分条件] </strong> \n",
    "\t设 $f(x)$ 是 $\\mathbf{R}^n$ 上的 $n$ 元二阶可导函数. 若 $x^*$ 满足\n",
    "\t$$\t\\nabla f(x^*)=0,\\nabla^2 f(x^*) \\ \\text{负定} \\ (\\nabla^2 f(x^*)\\ \\text{正定}),$$\n",
    "\t则 $x^*$ 是 $f$ 的极大$($小$)$值点.\n",
    "</div>\n",
    "\n",
    "而代数学的知识告诉我们,**验证一个对称矩阵是否正(负)定只需要 check 其所有特征值是否大(小)于0**.\n",
    "\n",
    "所以$,$ 要制定最佳的生产计划 $(n_1^*,n_2^*,n_3^*)$ 使得利润与成本比值最大$,$ 即求解问题(2)$,$ 只需要求出$3$元方程组\n",
    "$$\\nabla r=0$$\n",
    "的解集$,$ 再挑出解集中使得 $\\nabla^2 r$ 负定的解$,$ 这就是我们的最佳生产计划 $(n_1^*,n_2^*,n_3^*)$!\n",
    "\n",
    "最优化条件给出了这样一个基本事实 : 不管函数 $f$ 表达式复杂与否$,$ 只要二阶以上可导$,$ 我们只需要找出满足 Hesse 矩阵 $\\nabla ^2f$ 半负定$($半正定$)$的梯度零点$,$ 极大$($小$)$值点必定存在其中! "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d46610fc",
   "metadata": {},
   "source": [
    "<div class=\"alert alert-info\" role=\"alert\">\n",
    "❓ 这时喜欢思考的同学就会问了$,$ 老师$,$ 既然我们通过求极值要通过求解梯度方程 $\\nabla f=0,$ 那么变量一旦多起来$,$ 求解方程组的难度也会迅速上升$,$ 并且还存在方程无法求解的问题$($比如超越方程 $\\ln x+x-3=0),$ 这个时候怎么办呢?\n",
    "</div>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6e1773e3",
   "metadata": {},
   "source": [
    "虽然抽象的理论只能提供许多$\"$理论上可行$\"$的解决方式$,$ 但俗话说的好$,$ 车到山前必有路$,$ 方程求解不出来$,$ 我们能不能找到近似解呢? 计算机说$,$ 💃退!💃退! 💃退!\n",
    "\n",
    "其实$,$ 现实生活中我们遇到的许多优化问题需要解的方程都是超越方程$,$ 早已超出人力计算的范畴$,$ 而我们衍生的许多数值计算方法就是为了求出这类方程的近似解的. 优化问题中一个最经典的求极值算法便是针对优化条件 \\ref{prop 1+} 发明的**梯度下降法**——通过迭代的方式找到一列**梯度递减的点**,当点的**梯度下降的足够接近$0$**时便可认为该点即是极值的候选之一. \n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b5b4f24a",
   "metadata": {},
   "source": [
    "下面我们介绍如何使用scipy求解多元函数的极值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "a8ae5439",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-06-03T07:11:43.629821Z",
     "start_time": "2022-06-03T07:11:41.336015Z"
    }
   },
   "outputs": [],
   "source": [
    "import scipy.optimize as opt\n",
    "from scipy import fmin\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "5b32bfbd",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-06-03T07:11:43.739148Z",
     "start_time": "2022-06-03T07:11:43.630818Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "      fun: 0.126002550664395\n",
       " hess_inv: <3x3 LbfgsInvHessProduct with dtype=float64>\n",
       "      jac: array([ 6.23612277e-04,  3.70947719e-04, -8.03801974e-06])\n",
       "  message: 'CONVERGENCE: NORM_OF_PROJECTED_GRADIENT_<=_PGTOL'\n",
       "     nfev: 64\n",
       "      nit: 15\n",
       "     njev: 16\n",
       "   status: 0\n",
       "  success: True\n",
       "        x: array([  1.        ,   1.        , 123.68197812])"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def func0(cost, x, a):\n",
    "    return cost*x*(2 - exp(-(x - a)**2))\n",
    "func = lambda x: (2000*x[0] + 3000*x[1] + 4500*x[2]) / (func0(750, x[0], 6000) + func0(1250, x[1], 5000) + func0(2000, x[2], 3000)) - 1 \n",
    "bnds = ((1, 10000), (1, 10000), (1, 10000))\n",
    "res = opt.minimize(fun=func, x0=np.array([2, 1, 1]), bounds=bnds)\n",
    "res"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dbb221de",
   "metadata": {},
   "source": [
    "## (二) : 以插值知识解决数据处理问题"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b1d2a5ca",
   "metadata": {},
   "source": [
    "<div class=\"alert alert-info\" role=\"alert\">\n",
    "❓ GitModel 公司工作室刚刚建完，准备安装宽带以及路由，基于传输数据要求，GitModel 需要的宽带运营商网速越快越好，而由于网速是一个随时间变化的非固定量，简单衡量平均网速也并非一个好的评价手段, GitModel 准备收集在同一个地点各个运营商的宽带一天内的网速数据<strong>以做接下来的建模分析</strong>, 出于人力考虑,网速监视每小时汇报一次数据. A运营商的宽带24小时网速如下表: \n",
    "</div>\n",
    "\n",
    "<img src=\"./figures/1-5.png\" width = 200>\n",
    "\n",
    "<div class=\"alert alert-info\" role=\"alert\">\n",
    "然而$,$ 应该注意到离散的数据点无法完美体现网速的整体性质$,$ 我们需要通过仅有的数据点还原宽带一天内的实时网速. 以 $A$ 运营商为例$,$ 请问 GitModel 公司应如何$\"$模拟$\"$出网速曲线呢?\n",
    "</div>\n",
    "\n",
    "该问题说数学话版$,$ 就是需要找出一条经过上表 $24$ 个点 $(t_i,s_i),i=1,2,\\cdots,24$ 的曲线 $s=s(t),$ 我们自然会问$,$ 那怎么构造 $s(t)$ 合适呢? 又应该怎么说明构造的 $s(t)$ 能有较好的模拟效果呢?\n",
    "\n",
    "我们接着往下分析 : 由于宽带用户千千万万$,$ 大基数导致了使用宽带的用户数关于时间 $t$ 的变化是近似连续的$,$ 从而网速 $s(t)$ 可以假设为 $t$ 的连续函数$,$ 更甚之$,$ 可以假设为斜率以及曲率 $s'(t),s''(t)$ 连续! 我们将 $s(t)$ 的满足条件罗列如下 : \n",
    "- $s(t)$ 过 $24$ 个数据点 $s_i=s(t_i),i=1,2,\\cdots,24.$\n",
    "- $s(t)$ 连续.\n",
    "- $s'(t)$ 连续.\n",
    "- $s''(t)$ 连续.\n",
    "\n",
    "$s(t)$ 应该满足的条件暂且如此$,$ 我们再进行思考 : 有什么构造 $s(t)$ 方式是比较简单的呢?\n",
    "\n",
    "在高中我们就已经学过了给定一组数据点可通过**最小二乘法**来拟合出一条回归直线$,$ 诚然$,$ 两点一直线的数学直觉告诉我们能过 $24$ 个数据点的直线几乎不存在$,$ 那么我们可否放宽条件$,$ 构造出过 $24$ 个数据点的折线呢? 这显然是可以的! 过数据点的条件可由分段函数来解决.\n",
    "\n",
    "用数学的语言$,$ 即是分别在每一个区间 $[t_i,t_{i+1}],i=1,2,\\cdots,23$ 上以 $(t_i,s_i),(t_{i+1},s_{i+1})$ 为两端构造线段 $s_{i}(t)=k_it+b_i,t\\in [t_i,t_{i+1}],i=1,2,\\cdots,23,$ 其中 $k_i,b_i$ 为参数$,$ 但确定 $k_i,b_i$ 对我们来说也是小菜一碟的. 具体构造如下图 :\n",
    "\n",
    "<img src=\"./figures/1-6.jpg\" width = 400>\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "81c2e079",
   "metadata": {},
   "source": [
    "对比 $s(t)$ 要满足的条件$,$ 折线的构造方式显然满足了前两个条件$,$ 我们再结合上图进行思考 : 折线不满足 $s'(t)$ 连续是因为在数据点 $(t_i,s_i)$ 处不一定可导$,$ 即左右导数不相同$,$ 以此反推$,$ 我们希望构造出来的分段函数 $s_i(t)$ 们在$\"$连接处$\"(t_{i},s_i),(t_{i+1},s_{i+1})$ 都应该有导数以及二阶导数相等. 现在$,$ 我们正式将条件写为数学形式 : \n",
    "\n",
    "\\begin{align}\\label{eq 2.1}\n",
    "\t&\\text{过点 : } s_{i}(t_i)=s_i,i=1,2,\\cdots,23,s_{23}(t_{24})=s_{24}\\\\\n",
    "\t\\label{eq 2.2}&\\text{分段连接 : } s_{i}(t_{i+1})=s_{i+1}(t_{i+1}),i=1,2,\\cdots,22\\\\\n",
    "\t\\label{eq 2.3}&\\text{斜率相等 : }s_{i}(t_{i+1})=s_{i+1}'(t_{i+1}),i=1,2,\\cdots,22\\\\\n",
    "\t\\label{eq 2.4}&\\text{曲率相等 : }s_{i}''(t_{i+1})=s_{i+1}''(t_{i+1}),i=1,2,\\cdots,22\n",
    "\\end{align}\n",
    "那么$,$ 既然折线即分段一次函数不满足导数相等$,$ 从求导的难度上我们自然会考虑分段二次函数怎么样呢? Unfortunately$,$ 分段二次函数满足了导数相等但二阶导数不相等$,$ 而按图索骥我们即知道分段三次函数即能满足我们对 $s(t)$ 的所有期待!\n",
    "\n",
    "\\begin{align*}\n",
    "\t\\text{分段直线构造}&\\rightarrow{\\text{解决}} s(t) \\ \\text{过} \\ 24 \\ \\text{个数据点且连续}\\\\\n",
    "\t\\text{分段抛物线构造}&\\rightarrow{\\text{解决}}  s'(t) \\text{连续}\\\\\n",
    "\t\\text{分段三次曲线构造}&\\rightarrow{\\text{解决}}  s''(t) \\text{连续}\\\\\n",
    "\\end{align*}\n",
    "构造出来的分段三次曲线如下 : \n",
    "\\begin{equation}\\label{eq 2.5}\n",
    "\ts_i(t)=s_{i,0}+s_{i,1}t+s_{i,2}t^2+s_{i,3}t^3,i=1,2,\\cdots, 23\\\\\n",
    "\\end{equation}\n",
    "$($\\ref{eq 2.5}$)$ 应该满足 $($\\ref{eq 2.1},\\ref{eq 2.2},\\ref{eq 2.3},\\ref{eq 2.4}$),$ 一共是 $90$ 条方程$,$ 而未知数有 $92$ 个$,$ 事实上$,$ 仍需确定的只有起点 $(t_1,s_1)$ 与 $(t_{24},s_{24})$ 的二阶函数值 $s_1''(t_1),s_{23}''(t_{24}).$\n",
    "\n",
    "我们这里假设 $s_1''(t_1)=s_{23}''(t_{24})=0,$ 实际含义为在 $0:00\\sim 1:00$ 处的网速变化应该逐渐变慢$,$ 那么便可以通过 $($\\ref{eq 2.1},\\ref{eq 2.2},\\ref{eq 2.3},\\ref{eq 2.4}$)$ 与 $s_1''(t_1)=s_{24}''(t_{24})=0$ 建立方程组求出 $($\\ref{eq 2.5}$)$ 的所有未知数! \n",
    "\n",
    "好事成双$,$ 思维敏捷的同学应该已经发现了 : 对于多项式函数$,$ 无论求多少阶导$,$ 都是 $1,t,t^2,t^3$ 的线性组合! 而这即告诉我们需要解的方程组是一个线性方程组!\n",
    "\n",
    "<img src=\"./figures/1-7.jpg\">\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9d465c4d",
   "metadata": {},
   "source": [
    "<div class=\"alert alert-info\" role=\"alert\">\n",
    "<strong> 📋 小结： </strong> \n",
    "我们将这种构造过数据点函数的过程称为<strong>插值</strong>$,$ 在建模中常常用于数据的$\"$补充$\"$或者$\"$还原$\",$ 能有效解决建模中数据量过少的问题. 目前最通用的插值方式即上文提到的分段三次曲线构造$,$ 亦称为<strong>三次样条插值</strong>. 由于我们接触的许多数据是具有某种意义上的$\"$连续性$\"$的$,$ 而三次样条插值具有的最佳实用性质就是其$\"$摆动极小$\",$ 应用也就屡见不鲜了.\n",
    "</div>\n",
    "\n",
    "从上文我们知道如果有 $n$ 个数据点$,$ 那么三次样条插值的未知数$($即多项式系数$)$一共有 $4n$ 个而我们的条件所给出的方程只有 $4n-2$ 条$,$ 亦即还需要有 $2$ 个条件诱导 $2$ 条方程来解未知数$.$ 在本问题的最后我们给出三次样条插值的定义以及根据不同需求诱导的几种三次样条插值.\n",
    "\n",
    "<div class=\"alert alert-info\" role=\"alert\">\n",
    "<strong> 定义2:[插值] </strong> \n",
    "设 $(x_i,y_i),i=1,2,\\cdots,n$ 是 $\\mathbf{R}^2$ 上的 $n$ 个点$,$ $f:\\mathbf{R} \\to \\mathbf{R}$ 是一条满足 $y_i=f(x_i),i=1,2,\\cdots,n$ 的函数曲线$,$ 则 $f$ 称为 $(x_i,y_i)$ 的<strong>插值曲线</strong>.\n",
    "</div>\n",
    "\n",
    "<div class=\"alert alert-info\" role=\"alert\">\n",
    "<strong> 定义3:[三次样条插值] </strong> \n",
    "设 $(x_i,y_i),i=1,2,\\cdots,n$ 是 $\\mathbf{R}^2$ 上的 $n$ 个点$,$ 其三次样条插值函数为\n",
    " \t$$f_i(t)=s_{i,0}+s_{i,1}t+s_{i,2}t^2+s_{i,3}t^3,i=1,2,\\cdots, n-1,$$\n",
    " \t满足\n",
    " \t\\begin{align*}\n",
    " \t f_{i}(x_i)&=y_i,i=1,2,\\cdots,n-1,f_{n-1}(x_{n})=y_{n}\\\\\n",
    " \t f_{i}(x_{i+1})&=y_{i+1}(x_{i+1}),i=1,2,\\cdots,n-2\\\\\n",
    " \tf_{i}'(x_{i+1})&=y_{i+1}'(x_{i+1}),i=1,2,\\cdots,n-2\\\\\n",
    " \t\tf_{i}''(x_{i+1})&=y_{i+1}''(x_{i+1}),i=1,2,\\cdots,n-2.\n",
    " \t\\end{align*}\n",
    "</div>\n",
    "\n",
    "<img src=\"./figures/1-11.png\">\n",
    "\n",
    "其中 $h_i=x_{i+1}-x_i,d_i=\\dfrac{y_{i+1}-y_i}{x_{i+1}-x_i},i=1,2,\\cdots,n-1.$\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "80d6dd03",
   "metadata": {},
   "source": [
    "## (三) : 以积分知识解决工程问题"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f4999f7b",
   "metadata": {},
   "source": [
    "<div class=\"alert alert-info\" role=\"alert\">\n",
    "❓ 鉴于 GitModel 公司刚上市$,$ 承接了许多数学建模相关业务. 有一家工程企业给出了这样一个任务 : 该企业准备制造一批抽水机$,$ 需要得到其各种数据来决定抽水机的性能参数. 企业首先对圆柱形的储水桶进行了抽水测试$,$ 需要求出将桶内的水全部抽出需要做多少功？\n",
    "\n",
    "储水桶的数据如下 : 高 $5\\mathrm{m}$ $,$ 底面圆半径 $3\\mathrm{m}$：\n",
    "<img src=\"./figures/1-12.jpg\" width=400>\n",
    "</div>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8e689196",
   "metadata": {},
   "source": [
    "为了将水抽出来$,$ 抽水机只需要施加与水相同的重力 $G$ 即可. 然而$,$ 如图所示$,$ 不同水平面上抽水的位移是不同的$,$ 这导致我们无法将整桶水看作一个质点$,$ 自然无法用高中物理的做功计算求出数值.\n",
    "<img src=\"./figures/1-13.jpg\" width=300>\n",
    "<center>不同平面位移不同</center>\n",
    "\n",
    "<img src=\"./figures/1-14.jpg\" width=300>\n",
    "<center>离散分割</center>\n",
    "\n",
    "老师$,$ 我只知道高中物理的方法$,$ 能不能改进高中物理方法来解决这个问题呢: **整桶水无法看作一个质点$,$ 那能否将整桶水看作 $n$ 个单位质点呢?**\n",
    "\n",
    "众所周知$,$ 水桶中的水是**连续**的整体$,$ 如果我们将水分割成 $n$ 个单位$,$ 那么求出来的数值只是一个近似$,$ 不过当 $n$ 越来越大时$,$ 误差就会越来越小!\n",
    "\n",
    "由于抽水过程水的位移只有垂直方向$,$ 我们从高到低将水有序分割成 $n$ 个单位$,$ 每个单位都是一个小型水柱$,$ 长为 $h_i=\\dfrac{5}{n} \\mathrm{m},$ 简易计算可知单位重力为 $G_i=\\rho V_ig=\\rho gr^2\\pi h_i=\\dfrac{441\\pi}{n} \\mathrm{N}.$ 水柱的重心在体心$,$ 那么抽第 $i$ 个单位的水需要的位移是 $x_i=\\dfrac{5i}{n}\\mathrm{m}.$ 所以抽水做功的近似值就是对数列 $G_ix_i$ 的前 $n$ 项求和\n",
    "\n",
    "$$\n",
    "W\\approx \\sum_{i=1}^nG_ix_i=\\dfrac{441\\pi}{n}\\sum_{i=1}^n\\dfrac{5i}{n}=441\\pi\\dfrac{5n+5}{2n}=1102.5\\pi+\\dfrac{5\\pi}{2n}.\n",
    "$$\n",
    "\n",
    "当 $n$ 越来越大时$,$ 误差项 $\\dfrac{5\\pi}{2n}$ 就会越来越小$,$ 我们有理由猜测抽水做功 $W$ 就是 $1102.5\\pi\\approx 3436 \\mathrm{J}$ !\n",
    "\n",
    "老师$,$ 那只是我们的猜测$,$ 有没有更精确的方法呢? \n",
    "\n",
    "当然有! 事实上$,$ 我们能分割水柱是因为每个**单位水柱中所有水的位移**是**近似相同**的$,$ 当分割当什么程度时单位中所有水的位移是相同的呢 : 分割至质点大小的时候$,$ 如图所示$,$ 这时每个单位水柱的位置及其位移可以用距离桶底的高度 $h$ 来完美表达! 这便是高中物理常用的微元法$,$ 而此时数列求和即变为积分!\n",
    "\n",
    "<img src=\"./figures/1-15.jpg\" width=300>\n",
    "\n",
    "\\begin{align*}\n",
    "\t\\text{单位长度} \\ h_i &\\rightarrow{n \\text{越来越大}} \\text{长度微分} \\ dh,\\\\\n",
    "\t\\text{单位重力} \\ G_i&\\rightarrow{n \\text{越来越大}} \\text{重力微分} \\ dG=\\rho g r^2\\pi dh=88.2\\pi dh,\\\\\n",
    "\t\\text{单位位移} \\ x_i&\\rightarrow{n \\text{越来越大}} \\text{位移函数} \\ x(h)=5-h,\\\\\n",
    "\t\\text{做功总和} \\ \\sum_{i=1}^nG_ix_i &\\rightarrow{n \\text{越来越大}}  \\text{做功积分}\\ \\displaystyle\\int_{0}^5 x(h)dG =\\displaystyle\\int_{0}^5 88.2\\pi (5-h)dh.\n",
    "\\end{align*}\n",
    "\n",
    "利用python进行数值计算得："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "50e96187",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-06-03T07:16:48.741776Z",
     "start_time": "2022-06-03T07:16:48.732778Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3463.605900582747"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from scipy import integrate # 已知函数表达式积分\n",
    "from scipy import pi\n",
    "def f(h):\n",
    "    '''\n",
    "    定义函数表达式.\n",
    "    '''\n",
    "    return 88.2 * pi * (5 - h)\n",
    "v, err = integrate.quad(f, 0, 5) # 被积函数与积分区间\n",
    "v"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "d6b36248",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3461.8500000000004"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "1102.5*3.14\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "65ce8b02",
   "metadata": {},
   "source": [
    "<div class=\"alert alert-info\" role=\"alert\">\n",
    "<strong> 📋 小结： </strong> \n",
    "本质上$,$ 微元法其实就是分析学中积分的应用 : 将<strong>连续变化</strong>的函数 $($变力做功$,$ 恒力变位移做功$,$ 连续型随机变量期望值等等连续物理量$)$ 先微分再积分得到相关量$,$ 这在处理<strong>非离散或离散程度小的建模问题</strong>中尤为常见.\n",
    "</div>\n",
    "\n",
    "<div class=\"alert alert-info\" role=\"alert\">\n",
    "❓ 紧接着 GitModel 公司又接到另一家工程企业的任务 : 由于吊桥的年久失修导致一些铁链生锈而质量发生了改变$,$ 为保证安全必须重新测量铁链的总体质量$,$ 而体积巨大难以拆卸重组的铁链无法直接测量其质量$,$ 仅能靠检测每块铁环的质量来估计整体变化的质量$,$ 然而逐块检测是一项巨大的工程$,$ 需要耗费巨额的时间与人力.\n",
    "\n",
    "据专家分析$,$ 若以桥梁中心为原点建立空间坐标系$,$ 铁链的 $y$ 轴坐标可以近似相同. 铁链上每块铁环的密度仅与其所处的横向距离以及海拔 $(x,z)$ 有关$,$ 经数值拟合可得到密度 $(\\mathrm{kg}/\\mathrm{m}^3)$ 与位置 $(\\mathrm{m})$ 的函数为 \n",
    "$$\n",
    "\\rho(x,z)=7860\\left(1+1.5^{2-\\frac{z}{10}-0.1\\left(\\frac{x}{50}\\right)^2}\\right)\n",
    "$$ 及铁链的垂直面曲线方程为\n",
    "$$z=30\\cosh \\dfrac{x}{300},\n",
    "$$ 铁环是圆柱形的$,$ 半径为 $r=0.15 \\mathrm{m}$. GitModel 公司如何通过不直接检测的方式来估计铁链的质量呢?\n",
    "    \n",
    "<img src=\"./figures/1-16.jpg\" width=300>\n",
    "<center> 吊索桥图示 </center>\n",
    "<img src=\"./figures/1-17.jpg\" width=400>\n",
    "<center> 平面曲线 </center>\n",
    "</div>\n",
    "\n",
    "我们发现$,$ 这其实也是类似于上文问题的离散程度小的问题 $($因为铁链的铁环数足够多使得我们可以近似于连续问题$),$ 每块铁环可以当作圆柱形状的微元$,$ 其具有密度与位置的函数 $\\rho(x,z),$ 长度微分 $ds$ 以及体积微分 $dV$  那么我们同样可以应用积分来求出质量.\n",
    "\n",
    "那么该问题是否可以照搬上文的方法呢? 我们接着往下分析两个问题的不同. 应该注意到 : 第一个问题是位移**在垂直直线上的分布**, 而该问题是密度 $($质量$)$ **在曲线上的分布** $,$ 这代表着我们无法通过常规积分的方式来求$,$ 因为我们的坐标轴不是一条直线!\n",
    "\n",
    "当然$,$ 分析学同样提供了在曲线上的积分方式$,$ 我们称为曲线积分. 本问题就是一个经典的**第一型曲线积分**问题——知道曲线上每个点 $(x,z)$ 上的**分布函数** $\\rho(x,z),$ 求曲线的质量 $M=\\displaystyle\\int_L m(x,z)ds,$ 其中$,$ 类似于我们对坐标 $x$ 做微分 $dx,$ 曲线上的坐标可以用长度来表示$,$ 所以我们对曲线的长度做了微分 $ds$ 后进行积分处理. 与直线积分有所不同的是$,$ 我们无法以曲线为轴$,$ 但仍然可以将曲线放在坐标系中$,$ 此时由勾股定理我们可以求出长度微分的表达式$,$ 如下 : \n",
    "\n",
    "\\begin{align}\n",
    "\t\\text{单位长度} \\ s_i=\\sqrt{x_i^2+z_i^2} &\\rightarrow{\\text{分割越来越细}} \\text{长度微分} \\ ds=\\sqrt{(dx)^2+(dz)^2},\\\\\n",
    "\t\\text{单位体积} \\ V_i=s_ir^2\\pi &\\rightarrow{\\text{分割越来越细}} \\text{体积微分} \\ dV=r^2\\pi ds,\\\\\n",
    "\t\\text{单位质量} \\ m_i=\\rho(x,z)V_i&\\rightarrow{\\text{分割越来越细}} \\text{质量函数} \\  \\rho(x,z)  dV,\\\\\n",
    "\t\\text{总质量} \\ \\sum_{i=1}^{n}\\rho(x_i,z_i)V_i &\\rightarrow{\\text{分割越来越细}}  \\text{质量积分}\\ \\displaystyle\\int_L \\rho(x,z) dV=\\displaystyle\\int_L \\rho(x,z)r^2\\pi d s.\n",
    "\\end{align}\n",
    "\n",
    "**注:** 当 $\\rho(x,z)$ 恒等于 $1$ 时$,$ 事实上就是在求曲线的长度.\n",
    "\n",
    "在进行铁链质量数值估算之前$,$ 我们先给出第一型曲线积分的计算方式. 往往我们计算曲线积分需要知道曲线 $L$ 的参数方程 $x=x(t),z=z(t)$ 以及参数 $t$ 的取值范围 $[a,b]$. 问题中提到铁链的近似方程为 $z=30\\cosh \\dfrac{x}{300},$ 也就是说$,$ 铁链曲线的参数方程可用 $x$ 作为参数$,$ 其范围是 $[-300,300],$ 我们将铁链曲线方程写成如下参数形式 :\n",
    "\n",
    "$$\\begin{cases}\n",
    "\tz(x)=30\\cosh \\dfrac{x}{300}\\\\\n",
    "\tx(x)=x\\\\\n",
    "\\end{cases},x\\in [-300,300]$$ 那么$,$ 铁链的质量可由如下曲线积分计算方式给出 : \n",
    "\n",
    "<div class=\"alert alert-info\" role=\"alert\">\n",
    "<strong> 定义4:[第一型曲线积分的计算方式] </strong> \n",
    "设平面曲线 $L$ 的参数方程为 $x=x(t),z=z(t),t\\in [a,b],$ $\\rho(x,z)$ 为定义在 $L$ 上的连续函数$,$ 则\n",
    "\t$$\\displaystyle\\int_{L}\\rho(x,z)d s=\\displaystyle\\int_{a}^b\\rho(x(t),z(t))\\sqrt{(x'(t))^2+(z'(t))^2}d t.$$ \n",
    "</div>\n",
    "\n",
    "我们代入问题给出的方程 $\\rho(x,z),z(x)$ 以及铁环半径 $r=0.15 \\mathrm{m}^3$ 即可得到铁链的总质量计算式为\n",
    "$$11.79\\displaystyle\\int_{-300}^{300}\\left(1+1.5^{2-3\\cosh\\frac{x}{300}-0.1\\left(\\frac{x}{50}\\right)^2}\\right)\\sqrt{100+\\sinh^2\\dfrac{x}{300}}dx.$$\n",
    "\n",
    "下面给出第一型曲线积分python代码，铁链质量的估算值为 $98635 ~\\mathrm{t}$\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "59a2af5a",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-06-03T07:34:39.959817Z",
     "start_time": "2022-06-03T07:34:39.950841Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "98635.09908278256"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 第一型曲线积分\n",
    "from scipy import sinh, cosh, sqrt\n",
    "def f(x):\n",
    "    index1 = (2 - 3 * cosh(x/300) - 0.1 * ((x/50)**2))\n",
    "    return (1 + 1.5 ** index1) * sqrt(100 + (sinh(x/300))**2)\n",
    "\n",
    "v, err = integrate.quad(f, -300, 300)\n",
    "v * 11.79\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b06110aa",
   "metadata": {},
   "source": [
    "<div class=\"alert alert-info\" role=\"alert\">\n",
    "❓ 有了直线积分$,$ 曲线积分$,$ 我们自然会问 : 有没有平面积分以及曲面积分呢? 当然! 事实上$,$ 由于我们还会接触变力曲线做功$,$ 这代表在每个点上的分布函数不再是标量函数而是向量函数! 分析学还给出了第二类曲线积分以及曲面积分.\n",
    "</div>\n",
    "<img src=\"./figures/1-18.png\">\n",
    "\n",
    "有一位爱钻牛角尖的同学发出了提问——老师$,$ 这样的方法还是太$\"$数学$\"$了$,$ 并且理想很丰满$,$ 现实很骨感$,$ 万一**没有函数表达式呢?**又万一有函数表达式但**积分太难算了呢?**\n",
    "\n",
    "别急$,$ 数学家也想到了应用性的问题$,$ 理论总是要落地的嘛! 所以有了计算机之后$,$ 许多数值计算的方法也被发明了出来$,$ 其中就包括了**数值积分**的方法——计算机可以通过数值方法对许多**不连续**函数甚至是**无法写出表达式**的函数进行积分! 这便很好地解决了积分在实际应用上的问题.这将在我们的**2.0课程中与大家见面**👋\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1312e4a8",
   "metadata": {},
   "source": [
    "## 实战项目——人口增长问题"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "76065673",
   "metadata": {},
   "source": [
    "<div class=\"alert alert-warning\" role=\"alert\">\n",
    "<h4>💼 任务来袭</h4>\n",
    "\n",
    "GitModel 公司对面试的实习生给出了这样一个问题 : 搜集 $1950\\sim 2020$ 年间美国人口数据$,$ 猜测其满足的函数关系$,$ 并综合数据预测美国 $2030$ 年的人口数.\n",
    "\n",
    "公司希望实习生就以下的<strong>开放性</strong>问题给出自己的想法，公司要求实习生<strong>提交预测的思路$,$ 模型$,$ 算法以及结果</strong>.\n",
    "\n",
    "面试官给出了如下提示 : 预测值与真实值存在误差$,$ 该问题如何转化为可用上述所学的知识解决的问题呢? \n",
    "</div>\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "95f6c8e8",
   "metadata": {},
   "source": [
    "<div class=\"alert alert-warning\" role=\"alert\">\n",
    "$($1$)$  从你的数据来看$,$你猜想美国人口与时间的关系应该满足怎样的函数关系$($线性$,$二次$,$或是其他$)$? 这样的函数关系你如何确定? 又怎么衡量这个函数具有良好的预测效果?[请在下方Markdown方格中写下你的答案]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "b0cb7e94",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "id": "f72ae6e3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>年份</th>\n",
       "      <th>人口</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1955</td>\n",
       "      <td>171685336</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1960</td>\n",
       "      <td>186720571</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1965</td>\n",
       "      <td>199733676</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1970</td>\n",
       "      <td>209513341</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1975</td>\n",
       "      <td>219081251</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>1980</td>\n",
       "      <td>229476354</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>1985</td>\n",
       "      <td>240499825</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>1990</td>\n",
       "      <td>252120309</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>1995</td>\n",
       "      <td>265163745</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>2000</td>\n",
       "      <td>281710909</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>2005</td>\n",
       "      <td>294993511</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>2010</td>\n",
       "      <td>309011475</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>2015</td>\n",
       "      <td>320878310</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>2016</td>\n",
       "      <td>323015995</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>2017</td>\n",
       "      <td>325084756</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>2018</td>\n",
       "      <td>327096265</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>2019</td>\n",
       "      <td>329064917</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>2020</td>\n",
       "      <td>331002651</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      年份         人口\n",
       "0   1955  171685336\n",
       "1   1960  186720571\n",
       "2   1965  199733676\n",
       "3   1970  209513341\n",
       "4   1975  219081251\n",
       "5   1980  229476354\n",
       "6   1985  240499825\n",
       "7   1990  252120309\n",
       "8   1995  265163745\n",
       "9   2000  281710909\n",
       "10  2005  294993511\n",
       "11  2010  309011475\n",
       "12  2015  320878310\n",
       "13  2016  323015995\n",
       "14  2017  325084756\n",
       "15  2018  327096265\n",
       "16  2019  329064917\n",
       "17  2020  331002651"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.read_excel('./population.xlsx')\n",
    "head = [\"年份\",\"人口\"]\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "id": "3afd6445",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "26754.73998333334"
      ]
     },
     "execution_count": 87,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#线性\n",
    "year = df[\"年份\"]\n",
    "popu = df[\"人口\"]/10000\n",
    "year_ave = year.mean()\n",
    "popu_ave = popu.mean()\n",
    "popu_ave"
   ]
  },
  {
   "attachments": {
    "49acb9348dc2406eb07f29815448ff9c.png": {
     "image/png": "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"
    }
   },
   "cell_type": "markdown",
   "id": "21d06145",
   "metadata": {},
   "source": [
    "![49acb9348dc2406eb07f29815448ff9c.png](attachment:49acb9348dc2406eb07f29815448ff9c.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "id": "ebfadbf9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-4647983740.614857"
      ]
     },
     "execution_count": 85,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b = 0\n",
    "c = 0\n",
    "a = 0\n",
    "for i in range(18):\n",
    "    b += (year[i]-year_ave)*(popu[i]-popu_ave)\n",
    "    c += (year[i]-year_ave)*(year[i]-year_ave)\n",
    "b -= 18 * year_ave * popu_ave\n",
    "c -= 18 * year_ave * year_ave\n",
    "b = b/c\n",
    "\n",
    "a = popu_ave - b * year_ave\n",
    "\n",
    "from sympy import *\n",
    "\n",
    "x = symbols('x')\n",
    "y = a*x + b\n",
    "a\n",
    "# y.evalf(subs = {x:2030})"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "2ca629dd",
   "metadata": {},
   "source": [
    "<div class=\"alert alert-warning\" role=\"alert\">\n",
    "$($2$)$ 也许你可以尝试用不同的函数关系进行预测$,$比较一下是哪种函数更贴合数据$,$但是$,$越贴合数据的函数是否真的预测的结果越可信?你可以查阅资料去了解该问题$,$但我们更希望你能解释这个问题的内在原理$,$如果能给出相应的解决方法那就更好了![请在下方Markdown方格中写下你的答案]\n",
    "</div>\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "979c1407",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>1955</th>\n",
       "      <th>171685336</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1960</td>\n",
       "      <td>186720571</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1965</td>\n",
       "      <td>199733676</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1970</td>\n",
       "      <td>209513341</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1975</td>\n",
       "      <td>219081251</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1980</td>\n",
       "      <td>229476354</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   1955       171685336\n",
       "0       1960  186720571\n",
       "1       1965  199733676\n",
       "2       1970  209513341\n",
       "3       1975  219081251\n",
       "4       1980  229476354"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "7da76694",
   "metadata": {},
   "source": [
    "> 双击写下你的想法：\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2072791d",
   "metadata": {},
   "source": [
    "<div class=\"alert alert-success\" role=\"alert\">\n",
    "  <h4 class=\"alert-heading\">Well done!</h4>\n",
    "  <p>恭喜你，完成了《动手学高等数学》的学习，希望在日后的数模竞赛中，通过本课程的学习，你可以更加深刻的理解微积分的强大之处.</p>\n",
    "  <hr>\n",
    "  <p class=\"mb-0\">如有需要领取本次组队学习的答案，敬请关注公众号以及留意直播讲解！</p>\n",
    "</div>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "88d8d22e",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.12"
  },
  "latex_envs": {
   "LaTeX_envs_menu_present": true,
   "autoclose": false,
   "autocomplete": true,
   "bibliofile": "biblio.bib",
   "cite_by": "apalike",
   "current_citInitial": 1,
   "eqLabelWithNumbers": true,
   "eqNumInitial": 1,
   "hotkeys": {
    "equation": "Ctrl-E",
    "itemize": "Ctrl-I"
   },
   "labels_anchors": false,
   "latex_user_defs": false,
   "report_style_numbering": false,
   "user_envs_cfg": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
